❓ 하지만, 여기까지는 아직 주소값만 지정해준 것이기 때문에, 이 json파일을 배열로써 나타나게 해줘야 한다.
1 2
// 우선 cities라는 빈 배열을 만들어주자 const cities = [];
⭐ 그렇다면, 이제 어떻게 저 주소로부터 city 값들을 불러들여올 수 있을까?
=> fetch API를 사용하면 된다 !
fetch API
💡 fetch는 서버에 네트워크 요청을 할 수 있도록 도와주는 AJAX기반의 API다.
💡 fetch(접근하고자 하는 url, 옵션) then.() == 호출에 성공했을 때 응답객체를 resolve
즉, then은 fetch에 대한 응답형태 및 방식이라고 보면 된다.
1 2 3 4 5 6
//우선, 나는 json 주소를 endpoint로 지정해뒀으니까 주소 대신 변수명을 넣어준다. fetch(endpoint) //Blob은 타입이 존재하는 바이너리 객체! .then((Blob) => Blob.json()) //이제 이 json 데이터를 위에서 생성한 cities 배열에 push 해주면 기본적인 세팅은 끝! .then((data) => cities.push(...data));
fetch(endpoint)를 통해 Promise가 resolve됐음
Blob형태의 json 값들이 배열로 반환됨
검색을 통해 해당하는 city 찾기!
❓ 일단 findMatches라는 함수를 생성할건데, filter 조건 내에서 검색창에 입력될 글자는 매번 다를 것이므로 이를 어떻게 변수화 할지가 관건이다. 이것을 해결해줄 기능이 바로 “**RegEXP와 match()”**다.
RegExp
🔥 정규표현식 = 문자검색, 문자 대체, 문자추출에 주로 사용
new RegExp(표현식, 플래그)
match()
🔥 정규표현식에 맞는 문자열을 찾아서 배열 객체**(문자열 형태)**로 반환한다.
1 2 3 4 5 6 7 8
functionfindMatches(wordToMatch, cities) { return cities.filter((place) => { // 모든 문자와 여러줄을 영어 대소문자를 구분하지 않고 받아들임 const regex = newRegExp(wordToMatch, 'gi'); // "||"은 or을 뜻한다는 점 복기! return place.city.match(regex) || place.state.match(regex); }); }
검색어에 해당하는 city or state 나타내기
💡 우선, 검색창과 검색결과가 보여질 html 요소를 정의해주고, addEventListener를 통해 변화에 따른 함수 실행을 설정하자
1 2 3 4 5 6 7
// html 요소 정의 const searchInput = document.querySelector('.search'); const suggestions = document.querySelector('.suggestions');
// addEventListener 사용 searchInput.addEventListener('change', displayMatches); searchInput.addEventListener('keyup', displayMatches);